package com.dsbj.it.DingTalkBotStarter.util;

import com.alibaba.excel.annotation.ExcelProperty;

import java.lang.reflect.Field;
import java.util.*;

public class ExcelPropertyUtil {


    /**
     * 获取指定类中被@ExcelProperty注解标记的字段集合
     */
    public static List<Field> getExcelPropertyFields(Class<?> clazz) {
        List<Field> result = new ArrayList<>();

        // 获取类中所有字段（包括私有字段）
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            // 判断字段是否有@ExcelProperty注解
            if (field.isAnnotationPresent(ExcelProperty.class)) {
                result.add(field);
            }
        }

        return result;
    }

    public static Map<Integer, String> getIndexToFieldMap(Class<?> clazz) {
        Map<Integer, String> indexFieldMap = new HashMap<>();

        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(ExcelProperty.class)) {
                ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
                int index = annotation.index();
                // 以index为键，字段名为值存入Map
                indexFieldMap.put(index, field.getName());
            }
        }

        return indexFieldMap;
    }

    /**
     * 从表头数据中剔除固定表头数据
     * @param headerData 完整的表头数据
     * @param fixedHeaders 固定的表头数据
     * @return 剔除固定表头后剩余的表头数据
     */
    public static Map<Integer, String> filterFixedHeaders(Map<Integer, String> headerData, Map<Integer, String> fixedHeaders) {
        // 获取固定表头的所有index值
        Set<Integer> fixedIndexes = fixedHeaders.keySet();

        // 用于存储筛选后的结果
        Map<Integer, String> filteredHeaders = new HashMap<>();

        // 遍历表头数据，只保留不在固定表头中的条目
        for (Map.Entry<Integer, String> entry : headerData.entrySet()) {
            Integer index = entry.getKey();
            // 如果当前index不在固定表头的index集合中，则保留
            if (!fixedIndexes.contains(index)) {
                filteredHeaders.put(index, entry.getValue());
            }
        }

        return filteredHeaders;
    }
}
